package org.skywork.bll.process.register.basic;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : SkyWork Bussiness Logic Layer
// Archivo : RegistrarArrendatario.java
// Descripcion : Clase RegistrarArrendatario
// *************************************************************************/
// Version : 2.11.8
// Fecha de Creación: 30 de Diciembre de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.sql.Connection;
import java.sql.SQLException;
import org.skywork.bll.system.MessageControl;
import org.skywork.bll.process.SkyWorkControllerSQL;
import org.skywork.bll.process.Validate;
import org.skywork.dal.system.SystemDAO;
import org.skywork.dal.basic.ArrendatarioDAO;
import org.skywork.dal.basic.EmpresaDAO;
import org.skywork.dal.basic.EntidadDAO;
import org.skywork.dal.basic.PersonaDAO;
import org.skywork.entitys.basic.Arrendatario;
import org.skywork.entitys.basic.Empresa;
import org.skywork.entitys.basic.Persona;
import org.sql.commands.exception.DMLException;
import org.sql.connector.operations.DataServer;
import org.tools.Result;

public final class RegistrarArrendatario extends SkyWorkControllerSQL {
    
    // Atributos de la clase RegistrarArrendatario
    
    private final Arrendatario arrendatario;
    
    // Constructor de la clase RegistrarArrendatario
    
    private RegistrarArrendatario(Arrendatario arrendatario) {
        this.arrendatario = arrendatario;
    }
    
    // Metodos de la clase RegistrarArrendatario
    
    /**
     *  Este método nos permite obtener el objeto que ejecuta el proceso de Registro
     * de una Arrendatario en el Sistema. Donde le arrendatario a registrar se establece con un
     * objeto <code>Arrendatario</code>.
     * 
     * @param arrendatario Arrendatario a registrar en el Sistema
     * @return Retorna el proceso en un objeto <code>RegistrarArrendatario</code>.
     */
    public static RegistrarArrendatario getInstance(Arrendatario arrendatario) {
        return new RegistrarArrendatario(arrendatario);
    }
    
    // Metodos sobreescritos de la clase RegistrarArrendatario

    @Override
    public Result validate() {
        if (arrendatario.getEntidad() instanceof  Persona) {
            result = Validate.validatePersona((Persona) arrendatario.getEntidad());
        } // La entidad a registrar es una Persona
        
        else {
            result = Validate.validateEmpresa((Empresa) arrendatario.getEntidad());
        } // La entidad a registrar es una Empresa
        
        return result; // Retornando el resultado de la Validación
    }

    @Override
    public Result configurateData() {
        result.setSuccess(false); result.setCode(Result.ERROR);
        return result; // Retornando el resultado de la Reconfiguración
    }

    @Override
    public Result process(Connection connection) throws SQLException, DMLException {
        connection.setAutoCommit(false); // Se ejecutaran transacciones
        SystemDAO.getInstance().setConnection(connection);
        arrendatario.getEntidad().setFechaRegistro(createDate(DataServer.getDate(connection)));
        arrendatario.getEntidad().setHoraRegistro(createTime(DataServer.getTime(connection)));
        EntidadDAO.registrar(arrendatario.getEntidad());
        
        if (arrendatario.getEntidad() instanceof  Persona) {
            PersonaDAO.registrar((Persona) arrendatario.getEntidad());
        } // La entidad es una Persona
        
        else {
            EmpresaDAO.registrar((Empresa) arrendatario.getEntidad());
        } // La entidad es una Empresa
        
        ArrendatarioDAO.registrar(arrendatario); connection.commit(); 
        result.setMessage(MessageControl.get(MessageControl.REGISTRO_ARRENDATARIO));
        result.setSuccess(true); result.setCode(Result.INFORMATION);
        
        return result; // Retornando el resultado del Proceso
    }

    @Override
    public Result processSQLException(SQLException ex) {
        result.setMessage(ex.getMessage());
        
        switch (ex.getErrorCode()) {
            case (1062) :
                if (arrendatario.getEntidad() instanceof  Persona) {
                    result.setMessage(MessageControl.get(MessageControl.PERSONA_EXISTE));
                } // La entidad es una Persona
                
                else {
                    result.setMessage(MessageControl.get(MessageControl.EMPRESA_EXISTE));
                } // La entidad es una Empresa
            break;
        }
        
        return result; // Retornando el resultado de la Excepción
    }
}